import axios from 'axios';
import qs from 'qs';
import router from '../router/index'

// axios.defaults.baseURL = "/api";

if (process.env.NODE_ENV === 'production') { //生产环}境
    axios.defaults.baseURL = "https://platform.easys.co";
}else{
    axios.defaults.baseURL = "http://120.78.224.168:5207";//线上
    // axios.defaults.baseURL = "https://platform.easys.co/";//线上
    // axios.defaults.baseURL = "http://192.168.1.30:5207";  //滔哥
    // axios.defaults.baseURL = "http://192.168.1.19:5207";    //瑶

}

const http = axios.create({
    // baseURL: 'https://platform.easys.co'
    // baseURL: 'http://192.168.1.30:5207'
    // baseURL: '/'
})
// 这里判断是否是开发环境

// 拦截器给所有请求头加一个token
http.interceptors.request.use( //响应拦截
    async config => {
        config.headers['Content-Type'] = "application/json";
        // config.data = JSON.stringify(config.data);
        // 每次发送请求之前判断vuex中是否存在token        
        // 如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
        // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断 
        // config.headers.token = sessionStorage.getItem('token')
        return config;
    },
    error => {
        return Promise.error(error);
    });

// 响应拦截器,全局请求拦截器, 通用的错误处理
http.interceptors.response.use(
    response => {
        if (response.status === 200) {
            return Promise.resolve(response); //进行中        
        } else {
            return Promise.reject(response); //失败       
        }
    },
    // 服务器状态码不是200的情况    
    error => {
        if (error.response.status) {
            switch (error.response.status) {
                // 401: 未登录                
                // 未登录则跳转登录页面，并携带当前页面的路径                
                // 在登录成功后返回当前页面，这一步需要在登录页操作。                
                case 401:
                    break
                // 403 token过期                
                // 登录过期对用户进行提示                
                // 清除本地token和清空vuex中token对象                
                // 跳转登录页面                
                case 403:
                    localStorage.clear();
                    router.push('/login')
                    break
                // 404请求不存在                
                case 404:
                    break;
                // 其他错误，直接抛出错误提示                
                default:
            }
            return Promise.reject(error.response);
        }
    }
);
/** 
 * get方法，对应get请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */

const $get = (url, params) => {
    return new Promise((resolve, reject) => {
        http.get(url, {
            params: params,
        })
            .then(res => {
                resolve(res.data);
            })
            .catch(err => {
                reject(err.data)
            })
    });
}
const $delete = (url, params) => {
    return new Promise((resolve, reject) => {
        http.delete(url, {
            params: params,
        }) //是将对象 序列化成URL的形式，以&进行拼接   
            .then(res => {
                resolve(res.data);
            })
            .catch(err => {
                reject(err.data)
            })
    });
}
/** 
 * post方法，对应post请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
const $post = (url, params) => {
    const headerJSON = {
        "Content-Type": "application/json"
    };
    const headerFormData = {
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
    };
    return new Promise((resolve, reject) => {

        http.post(url, JSON.stringify(params)) //是将对象 序列化成URL的形式，以&进行拼接   
            .then(res => {
                resolve(res.data);
            })
            .catch(err => {
                reject(err.data)
            })
    });
}
const $put = (url, params) => {
    return new Promise((resolve, reject) => {
        http.put(url, JSON.stringify(params)) //是将对象 序列化成URL的形式，以&进行拼接   
            .then(res => {
                resolve(res.data);
            })
            .catch(err => {
                reject(err.data)
            })
    });
}


//下面是vue3必须加的，vue2不需要，只需要暴露出去get，post方法就可以
export default {
    // install: (app) => {
    //     app.config.globalProperties['$get'] = $get;
    //     app.config.globalProperties['$post'] = $post;
    //     app.config.globalProperties['$put'] = $put;
    //     app.config.globalProperties['$delete'] = $delete;
    //     app.config.globalProperties['$axios'] = http;
    // }
    $get,   
    $post,
}